package com.example.synatx.parallel;

import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.stream.LongStream;
import java.util.stream.Stream;

/**
 * 并行流:把一个内容分为多个数据块,并用不同的现成分别处理每个数据块的流.
 */
public class ParallelStreamTest {


    /**
     * 在现实中,对顺序流调用parallel方法并不意味着流本身有任何实际的变化.它在内部实际上就是设了一个boolean标志,表示你想让调用parallel
     * 之后进行的所有操作都并行执行.
     * 可以对并行流调用sequential方法可以把它变成顺序流
     * 但是最后一次调用sequential或者parallel调用会影响整个流水线,并行和顺序执行受最后的方法而定.
     * @return
     */
    public Long sum(){
        //这是一个全局设置,因此它会影响代码中所有的并行流
        System.setProperty("java.util.concurrent.ForkJoinPool.common.parrallelism","12");
        return Stream.iterate(1L,i->i+1)
                .limit(100)
                .parallel()
                //.sequential()
                .reduce(0L,Long::sum);
    }

    public static long forkJoinSum(long n){
        long[] numbers = LongStream.rangeClosed(1,n).toArray();
        ForkJoinTask<Long> task = new ForkJoinSumCalc(numbers);
        return new ForkJoinPool().invoke(task);
    }

}
